/**
 * 2010(c) Copyright Oceansoft Information System Co.,LTD. All rights reserved.
 * <p>
 * Compile: JDK 1.6+
 * <p>
 * 版权所有(C)：江苏欧索软件有限公司
 * <p>
 * 公司名称：江苏欧索软件有限公司
 * <p>
 * 公司地址：中国苏州科技城青山路1号
 * <p>
 * 网址: http://www.oceansoft.com.cn
 * <p>
 * 作者: 090922(陈伟)
 * <p>
 * 文件名: com.oceansoft.mobile.common.util.StdRandom.java 
 * <p>
 * 类产生时间: 2014/4/13 23:22
 * <p>
 * 负责人: 090922(陈伟)
 * <p>
 * Email:javacspring@gmail.com
 * <p>
 * 所在组 : 掌上公安应用平台
 * <p>
 * 所在部门: 开发部--手持技术部
 * <p>
 * <p>
 */
package cn.com.oceansoft.nos.common.util;

import java.util.Random;

/**
 * 随机字符器生成器辅助类.
 *
 * @author: chenw
 * @time: 2014/4/13 23:22
 */
public class StdRandom {

    //随机数生成器
    private static Random random;
    //种子值
    private static long seed;

    //静态代码块，初始化种子值及随机数生成器
    static {
        seed = System.currentTimeMillis();
        random = new Random(seed);
    }

    //私有构造函数，禁止实例化
    private StdRandom() {
    }

    /**
     * 获取种子值
     *
     * @return long 随机数生成器的种子值
     */
    public static long getSeed() {
        return seed;
    }

    /**
     * 设置种子值
     *
     * @param s 随机数生成器的种子值
     */
    public static void setSeed(long s) {
        seed = s;
        random = new Random(seed);
    }

    /**
     * 随机返回0到1之间的实数 [0,1)
     *
     * @return double 随机数
     */
    public static double uniform() {
        return random.nextDouble();
    }

    /**
     * 随机返回0到N-1之间的整数 [0,N)
     *
     * @param N 上限
     * @return int 随机数
     */
    public static int uniform(int N) {
        return random.nextInt(N);
    }

    /**
     * 随机返回0到1之间的实数 [0,1)
     *
     * @return double 随机数
     */
    public static double random() {
        return uniform();
    }

    /**
     * 随机返回a到b-1之间的整数 [a,b)
     *
     * @param a 下限
     * @param b 上限
     * @return int 随机数
     */
    public static int uniform(int a, int b) {
        return a + uniform(b - a);
    }

    /**
     * 随机返回a到b之间的实数
     *
     * @param a 下限
     * @param b 上限
     * @return double 随机数
     */
    public static double uniform(double a, double b) {
        return a + uniform() * (b - a);
    }
}
